package com.sxj.corejava.code07_面向对象;

import java.util.Scanner;

/**
 * @author 石小俊
 * 2024年07月12日 14:17
 */
public class Test03_全局变量与局部变量 {
    public static void main(String[] args) {
        Account account = new Account();
        account.name = "admin";
        account.money = 5000;
        account.password = "666666";
        account.show("alice");
        account.test();
        account.showMenu();

        //Account account2 = new Account();
        //account2.name = "jack";
        //account2.money = 8000;
        //account2.password = "123456";
        //account2.show("aaa");

    }
}

class Account {
    // 全局变量,可以在当前类中使用
    String name;
    double money;
    String password;

    // 方法参数属于局部变量,仅能在该方法中使用
    public void show(String name) {
        // 局部变量,仅能在该方法中使用
        double money = 10000;
        // 当全局变量与局部变量没有重名时,可以直接使用
        // 如果全局变量与局部变量存在重名的时候,直接使用默认访问的是局部变量
        // 范围越小,优先级越高
        System.out.println("name:" + name + ",money:" + money + ",password:" + password);
        // 但是,在某些场景下,就想要获取全局变量的值,怎么办?
        // 可以通过this来实现
        // this代指的是具体的调用该方法的对象
        // 即:此时无法明确直到this表示的是谁,只有当该方法被调用时才能确定this表示的是谁
        // 哪个对象调用该方法,此时的this就表示哪个对象
        System.out.println("name:" + this.name + ",money:" + this.money + ",password:" + password);
    }

    public void test() {
        System.out.println("name:" + name + ",money:" + money + ",password:" + password);
    }

    /**
     * 查询余额,打印出户主姓名与账户余额
     */
    public void queryMoney() {
        System.out.println("提示:" + name + "当前账户余额为:" + money);
    }

    /**
     * 存钱,打印存储了多少钱,存储后账户余额
     * @param money
     */
    public void saveMoney(double money) {
        this.money += money;
        System.out.println("提示:您存储了" + money + "元,当前账户余额为:" + this.money);
    }

    /**
     * 转账,打印你给谁转账,转了多少钱,转账后账户余额是多少
     * @param name
     * @param money
     */
    public void transfer(String name, double money) {
        if (this.money >= money) {
            this.money -= money;
            System.out.println("提示:恭喜您,转账成功,您向" + name + "转账了" + money + "元,当前账户余额为:" + this.money);
        } else {
            System.out.println("错误:对不起,您的账户余额不足,转账失败!");
        }
    }

    /**
     * 取钱,打印取出了多少钱,剩余的账户余额是多少
     * @param money
     */
    public void getMoney(double money) {
        if (this.money >= money) {
            this.money -= money;
            System.out.println("提示:恭喜您取款成功,共取出" + money + "元,当前账户余额为:" + this.money);
        } else {
            System.out.println("错误:对不起,您的账户余额不足,取款失败!");
        }
    }

    public void showMenu() {
        Scanner sc = new Scanner(System.in);
        System.out.println("********************欢迎来到紫金银行********************");
        double money;
        String name;

        while (true) {
            System.out.print("请选择服务(1.查询余额 2.存款 3.转账 4.取钱 5退出):");
            int choice = sc.nextInt();
            switch (choice) {
                case 1:
                    queryMoney();
                    break;
                case 2:
                    System.out.print("请输入存款金额:");
                    money = sc.nextDouble();
                    saveMoney(money);
                    break;
                case 3:
                    System.out.print("请输入您向谁转账:");
                    name = sc.next();
                    System.out.print("请输入转账金额:");
                    money = sc.nextDouble();
                    transfer(name, money);
                    break;
                case 4:
                    System.out.print("请输入取款金额:");
                    money = sc.nextDouble();
                    getMoney(money);
                    break;
                case 5:
                    System.out.println("您已经退出,欢迎下次光临!");
                    return;
                default:
                    System.out.println("您输入的选项有误,请重新输入!");
            }
        }
    }
}
